package main

import (
	"fmt"
	"math"
	"unsafe"
)

func basicInt() {
	var a int = 4
	var a1 = 5
	a2 := 6
	fmt.Printf("%d, %d, %d \n", a, a1, a2)

	var b int8 = 12
	fmt.Println(b)

	var c int16 = 13
	fmt.Println(c)

	var d int32 = 15
	fmt.Println(d)

	var e int64 = 16
	fmt.Println(e)
}

func differentScale() {
	var num int = 12
	var num01 int = 0b1100
	var num02 int = 0o14
	var num03 int = 0xC

	fmt.Printf("2进制数 %b 表示的是: %d \n", num01, num01)
	fmt.Printf("10进制数 %d 表示的是: %d \n", num, num)
	fmt.Printf("8进制数 %o 表示的是: %d \n", num02, num02)
	fmt.Printf("16进制数 %X 表示的是: %d \n", num03, num03)
}

func floatBasic() {
	fmt.Printf("浮点数float32的最大值为: %f \n", math.MaxFloat32)
	fmt.Printf("浮点数float64的最大值为: %f \n", math.MaxFloat64)
}

func byteBasic() {
	var a byte = 65
	//8进制写法: 其中 \ 是固定前缀
	var a1 byte = '\101'
	//16进制写法: 其中 \x 是固定前缀
	var a2 byte = '\x41'
	fmt.Printf("byte 10进制%d, 表示: %c \n", a, a)
	fmt.Printf("byte 8进制%o,表示: %c \n", a1, a1)
	fmt.Printf("byte 16进制%x,表示: %c \n", a2, a2)

	//byte，占用1个节字，就 8 个比特位，
	//所以它和 uint8 类型本质上没有区别，它表示的是 ACSII 表中的一个字符
	var b uint8 = 66
	fmt.Printf("a 的值: %c \nb 的值: %c \n", a, b)
	// 或者使用 string 函数
	fmt.Println("a 的值: ", string(a), " \nb 的值: ", string(b))

	var d uint8 = 'A'
	var e byte = 'B'
	fmt.Printf("d 的值: %c \n", d)
	fmt.Printf("e 的值: %c \n", e)
}

func runeBasic() {
	//rune，占用4个字节，共32位比特位，
	//所以它和 int32 本质上也没有区别。它表示的是一个 Unicode字符
	var a byte = 'A'
	var b rune = '中'
	fmt.Printf("a 占用的字节数: %d \n", unsafe.Sizeof(a))
	fmt.Printf("b 占用的字节数: %d \n", unsafe.Sizeof(b))
}

func stringBasic() {
	var mystr01 string = "hello"
	var mystr02 [5]byte = [5]byte{104, 101, 108, 108, 111}
	fmt.Printf("mystr01: %s\n", mystr01)
	fmt.Printf("mystr02: %s", mystr02)
}

func strLength() {
	var aa string = "Hello 中国"
	fmt.Printf("aa 的字符串长度为: %d", len(aa))
}
func main() {
	basicInt()
	differentScale()
	floatBasic()
	byteBasic()
	runeBasic()
	stringBasic()
	strLength()
}
